﻿using GDM.Hogar.Aplicacion.Properties;
using GDM.Hogar.Controles.ControlesPersonalizados.Grilla;
using GDM.Hogar.Entidades;
using GDM.Hogar.Managers.Contratos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Configuracion
{
    public partial class PersonalCocinaUC : UserControl, IUserControl
    {
        private readonly IPersonalCocinaManager _personalCocinaManager;

        private IList<PersonalCocina> Datos { get; set; }

        private bool Editando { get; set; }

        public PersonalCocinaUC(IPersonalCocinaManager personalCocinaManager)
        {
            if (personalCocinaManager == null)
                throw new ArgumentNullException("personalCocinaManager");

            _personalCocinaManager = personalCocinaManager;
            InitializeComponent();
        }

        public void LimpiarValidador()
        {
            this.validador1.Clear();
        }

        private void PersonalCocinaUC_Load(object sender, EventArgs e)
        {
            Datos = _personalCocinaManager.ObtenerPersonalCocina();
            cgPersonalCocina.Configure(Datos.AsQueryable());
            ttInfo.SetToolTip(btnEliminar, "Eliminar");
            ttInfo.SetToolTip(btnEditarPersonalCocina, "Editar");
            if (cgPersonalCocina.Rows.Count <= 0) return;

            cgPersonalCocina.CurrentCell = null;
            cgPersonalCocina.ClearSelection();
        }

        private void RefrescarGrilla()
        {
            Datos = _personalCocinaManager.ObtenerPersonalCocina();
            cgPersonalCocina.Search(Datos.AsQueryable(), x => true);
        }

        private void GuardarPersonalCocina()
        {
            try
            {
                _personalCocinaManager.CrearPersonalCocina(txtNombre.Text.Trim(), txtApellido.Text.Trim());
                txtNombre.Clear();
                txtApellido.Clear();
                RefrescarGrilla();
            }
            catch (Exception ex)
            {
            }
        }

        private void EliminarPersonalCocina(int personalCocinaId)
        {
            try
            {
                _personalCocinaManager.ActivarPersonalCocina(personalCocinaId, false);
                RefrescarGrilla();
            }
            catch (Exception ex)
            {
            }
        }

        private void ActualizarPersonalCocina(PersonalCocina personalCocina)
        {
            try
            {
                _personalCocinaManager.ActualizarPersonalCocina(personalCocina);
                RefrescarGrilla();
            }
            catch (Exception ex)
            {
            }
        }

        private void btnGuardarPersonalCocina_Click(object sender, EventArgs e)
        {
            if (!validador1.Validate()) return;

            if (!Editando)
            {
                GuardarPersonalCocina();
            }
            else
            {
                var personalCocinaSeleccionado = (PersonalCocina)cgPersonalCocina.SelectedRows[0].DataBoundItem;
                var nombreNuevo = txtNombre.Text.Trim();
                var apellidoNuevo = txtApellido.Text.Trim();
                if (!(personalCocinaSeleccionado.Nombre.ToLower().Equals(nombreNuevo.ToLower()) && personalCocinaSeleccionado.Apellido.ToLower().Equals(apellidoNuevo.ToLower())))
                {
                    personalCocinaSeleccionado.Nombre = nombreNuevo;
                    personalCocinaSeleccionado.Apellido = apellidoNuevo;
                    ActualizarPersonalCocina(personalCocinaSeleccionado);
                }
                CancelarEdicion();
            }
        }

        private void btnEditarPersonalCocina_Click(object sender, EventArgs e)
        {
            if (cgPersonalCocina.SelectedRows.Count == 0) return;

            Editando = true;
            var personalCocinaSeleccionado = (PersonalCocina)cgPersonalCocina.SelectedRows[0].DataBoundItem;
            txtNombre.Text = personalCocinaSeleccionado.Nombre;
            txtApellido.Text = personalCocinaSeleccionado.Apellido;
            btnCancelar.Enabled = true;
        }

        private void CancelarEdicion()
        {
            Editando = false;
            txtNombre.Clear();
            txtApellido.Clear();
            btnCancelar.Enabled = false;
            validador1.Clear();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            CancelarEdicion();
        }

        private void cgPersonalCocina_SelectionChanged(object sender, EventArgs e)
        {
            CancelarEdicion();
        }

        private void validador1_CustomValidation(object sender, Controles.Validador.Componentes.ValidationEventArgs e)
        {
            if (!Editando)
            {
                e.Valid = !Datos.Any(x => x.Nombre.ToLower().Equals(txtNombre.Text.Trim().ToLower())
                                             && x.Apellido.ToLower().Equals(txtApellido.Text.Trim().ToLower()));
            }
            else
            {
                var personalCocinaSeleccionado = (PersonalCocina)cgPersonalCocina.SelectedRows[0].DataBoundItem;
                e.Valid = !Datos.Any(x => x.PersonalCocinaId != personalCocinaSeleccionado.PersonalCocinaId && (x.Nombre.ToLower().Equals(txtNombre.Text.Trim().ToLower())
                                             && x.Apellido.ToLower().Equals(txtApellido.Text.Trim().ToLower())));
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (cgPersonalCocina.SelectedRows.Count == 0) return;

            if (MessageBox.Show(Resources.Eliminar_Registro, Resources.Eliminando,
                                MessageBoxButtons.YesNo,
                                MessageBoxIcon.Question) != DialogResult.Yes) return;

            CancelarEdicion();
            var personalCocinaSeleccionado = (PersonalCocina)cgPersonalCocina.SelectedRows[0].DataBoundItem;
            EliminarPersonalCocina(personalCocinaSeleccionado.PersonalCocinaId);
        }

        private void cgPersonalCocina_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            btnEditarPersonalCocina_Click(null, null);
        }
    }
}